/*
*    へ　　　　　  ／|
*    /＼7　　   ∠＿/
*    /　│　　 ／　／               
*    │　Z ＿,＜　／　　 /`ヽ     
*    │　　　　　ヽ　　 /　　〉    
*    Y　　　　　  `  /　　/     
*    ｲ ●　､　●　⊂⊃〈　　/       
*    ()  へ　　　　 |　＼       
*    >ｰ ､_　 ィ　 │ ／／        | @author:smily
*    / へ　　 /　ﾉ＜| ＼＼       | @project:net-hole
*    ヽ_ﾉ　　(_／　 │／／        | @file: main.cpp
*    7　　　　　　　|／          | @time: 2020/12/25 16:29
*====＞―r￣￣`ｰ―＿===========    
*^^^^^^^^^^^^^^^^^^^^^^^^^^^
*/
#include "../include/MySocket.h"
#include "../include/NhSocket.h"

using namespace std;

int main(int argc, char *argv[]) {
    uint_fast16_t port;
    if (argc > 1) {
        port = atoi(argv[1]);
    } else {
        port = 6666;
    }

    char buffer[1024];
    int client_socket, recv_len;
    NhSocket my_socket_server;
    bool b_end = false;
    if (!my_socket_server.init_socket()) {
        printf("%s", my_socket_server.get_err_msg());
        return 0;
    }
    if (!my_socket_server.create_local(port)) {
        printf("%s", my_socket_server.get_err_msg());
        NhSocket::close_socket(my_socket_server.get_local_fd());
        return 0;
    }

    while (!b_end) {
        if (!my_socket_server.accept_link()) {
            continue;
        }

        while (!b_end) {
            if (!my_socket_server.recv_data(my_socket_server.get_remote_fd(), buffer, sizeof(buffer), recv_len)) {
                continue;
            }
            if (strcmp(buffer, "q") == 0) {
                break;
            }
            if (strcmp(buffer, "q!") == 0) {
                b_end = true;
                my_socket_server.send_data(my_socket_server.get_remote_fd(), "Server closed", 13);
            } else {
                char *ret = strcat(strcat(buffer, " too: "),
                                   inet_ntoa(my_socket_server.get_remote_addr().sin_addr));
                my_socket_server.send_data(my_socket_server.get_remote_fd(), ret,
                                           strlen(ret));
            }
        }
        NhSocket::close_socket(my_socket_server.get_remote_fd());
    }
    NhSocket::close_socket(my_socket_server.get_local_fd());
    printf("server exit");
    return 1;
}